Passed
Push — master ( f70f6c...2a3343 )
by EMP
01:13
created

main.js ➔ getCountryFlag   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
1
"use strict";
2
3
sodium.ready.then(function() {
4
5
const ae = new AllEars(function(ok) {
6
	if (ok) {
7
		document.getElementById("btn_enter").disabled = false;
8
	} else {
9
		console.log("Failed to load All-Ears");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
10
	}
11
});
12
13
let page=0;
14
15
function navMenu(num) {
16
	document.getElementById("div_readmsg").hidden = true;
17
18
	const b = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
19
	const d = document.getElementsByClassName("maindiv");
20
21
	for (let i = 0; i < 5; i++) {
22
		if (i === num) {
23
			b[i].disabled = true;
24
			d[i].hidden = false;
25
		} else {
26
			b[i].disabled = false;
27
			d[i].hidden = true;
28
		}
29
	}
30
}
31
32
function getCountryName(countryCode) {
33
	return "Unknown countrycode: " + countryCode;
34
}
35
36
function getCountryFlag(countryCode) {
37
	return sodium.to_string(new Uint8Array([
38
		240, 159, 135, 166 + countryCode.codePointAt(0) - 65,
39
		240, 159, 135, 166 + countryCode.codePointAt(1) - 65
40
	]));
41
}
42
43
function deleteButtonShow(show) {
44
	if (show) {
45
		document.getElementById("btn_msgdel").hidden = false;
46
		return;
47
	}
48
49
	const checkboxes = document.getElementById("tbd_inbox").getElementsByTagName("input");
50
	let checked = false;
51
52
	for (let j = 0; j < checkboxes.length; j++) {
53
		if (checkboxes[j].checked) {
54
			checked = true;
55
			break;
56
		}
57
	}
58
59
	document.getElementById("btn_msgdel").hidden = !checked;
60
}
61
62
function addIntMessage(i) {
63
	const tbl = document.getElementById("tbd_inbox");
64
	const row = tbl.insertRow(-1);
65
66
	const ts = ae.GetIntMsgTime(i);
67
	let cell = row.insertCell(-1);
68
	cell.setAttribute("data-ts", ts);
69
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
70
	cell.className = "mono";
71
72
	cell = row.insertCell(-1);
73
	cell.textContent = ae.GetIntMsgTitle(i);
74
	cell.onclick = function() {
75
		navMenu(-1);
76
		document.getElementById("div_readmsg").hidden = false;
77
		document.getElementById("readmsg_head").hidden = false;
78
		document.getElementById("readmsg_levelinfo").hidden = false;
79
		document.getElementById("readmsg_extmsg").hidden = true;
80
81
		document.getElementById("readmsg_title").textContent = ae.GetIntMsgTitle(i);
82
		document.getElementById("readmsg_from").textContent  = ae.GetIntMsgFrom(i);
83
		document.getElementById("readmsg_to").textContent    = ae.GetIntMsgTo(i);
84
		document.getElementById("readmsg_body").textContent  = ae.GetIntMsgBody(i);
85
		document.getElementById("readmsg_level").textContent = ae.GetIntMsgLevel(i);
86
87
		document.getElementById("readmsg_from").className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
88
		document.getElementById("readmsg_to").className = (ae.GetIntMsgTo(i).length === 16) ? "mono" : "";
89
	};
90
91
	// empty From1 cell
92
	row.insertCell(-1);
93
94
	cell = row.insertCell(-1);
95
	cell.textContent = ae.GetIntMsgFrom(i);
96
	cell.className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
97
98
	cell = row.insertCell(-1);
99
	cell.textContent = ae.GetIntMsgTo(i);
100
	cell.className = (ae.GetIntMsgTo(i).length === 16) ? "mono" : "";
101
102
	cell = row.insertCell(-1);
103
	cell.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.GetIntMsgIdHex(i) + "\">";
104
	cell.children[0].onchange = function() {deleteButtonShow(this.checked);};
105
}
106
107
function addExtMessage(i) {
108
	const tbl = document.getElementById("tbd_inbox");
109
	const row = tbl.insertRow(-1);
110
111
	const ts = ae.GetExtMsgTime(i);
112
	let cell = row.insertCell(-1);
113
	cell.setAttribute("data-ts", ts);
114
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
115
	cell.className = "mono";
116
117
	cell = row.insertCell(-1);
118
	cell.textContent = ae.GetExtMsgTitle(i);
119
	cell.onclick = function() {
120
		navMenu(-1);
121
		document.getElementById("div_readmsg").hidden = false;
122
		document.getElementById("readmsg_head").hidden = false;
123
		document.getElementById("readmsg_levelinfo").hidden = true;
124
		document.getElementById("readmsg_extmsg").hidden = false;
125
		document.getElementById("readmsg_greet").textContent = ae.GetExtMsgGreet(i);
126
		document.getElementById("readmsg_tls").textContent = ae.GetExtMsgTLS(i);
127
		document.getElementById("readmsg_ip").textContent = ae.GetExtMsgIp(i);
128
129
		document.getElementById("readmsg_country").textContent = getCountryName(cc) + " " + getCountryFlag(cc);
0 ignored issues
show
Bug introduced by
The local (let) variable cc is used before it is defined. This will cause a reference error.
Loading history...
130
131
		let flagText = "";
132
		if (!ae.GetExtMsgFlagPExt(i)) flagText += "<abbr title=\"The sender did not use the Extended (ESMTP) protocol\">SMTP</abbr> ";
133
		if (!ae.GetExtMsgFlagQuit(i)) flagText += "<abbr title=\"The sender did not issue the required QUIT command\">QUIT</abbr> ";
134
		if (ae.GetExtMsgFlagRare(i)) flagText += "<abbr title=\"The sender issued unusual command(s)\">RARE</abbr> ";
135
		if (ae.GetExtMsgFlagFail(i)) flagText += "<abbr title=\"The sender issued invalid command(s)\">FAIL</abbr> ";
136
		if (ae.GetExtMsgFlagPErr(i)) flagText += "<abbr title=\"The sender violated the protocol\">PROT</abbr> ";
137
		document.getElementById("readmsg_flags").innerHTML = flagText.trim();
138
139
		document.getElementById("readmsg_title").textContent = ae.GetExtMsgTitle(i);
140
		document.getElementById("readmsg_from").textContent = ae.GetExtMsgEnvFrom(i);
141
		document.getElementById("readmsg_to").textContent = ae.GetExtMsgEnvTo(i);
142
		document.getElementById("readmsg_body").innerHTML = ae.GetExtMsgBody(i);
143
		document.getElementById("readmsg_headers").textContent = ae.GetExtMsgHeaders(i);
144
145
		document.getElementById("readmsg_from").className = "";
146
		document.getElementById("readmsg_to").className = (ae.GetExtMsgEnvTo(i).length === 16) ? "mono" : "";
147
	};
148
149
	const from = ae.GetExtMsgHdrFrom(i);
150
	const from2 = from.substring(from.indexOf("@") + 1);
151
	const cc = ae.GetExtMsgCountry(i);
152
153
	cell = row.insertCell(-1);
154
	cell.textContent = from.substring(0, from.indexOf("@"));
155
156
	const flag = document.createElement("abbr");
157
	flag.textContent = getCountryFlag(cc);
158
	flag.title = getCountryName(cc);
159
160
	const fromText = document.createElement("span");
161
	fromText.textContent = " " + from2;
162
163
	cell = row.insertCell(-1);
164
	cell.appendChild(flag);
165
	cell.appendChild(fromText);
166
167
	cell = row.insertCell(-1);
168
	cell.textContent = ae.GetExtMsgEnvTo(i);
169
	cell.className = (ae.GetExtMsgEnvTo(i).length === 16) ? "mono" : "";
170
171
	cell = row.insertCell(-1);
172
	cell.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.GetExtMsgIdHex(i) + "\">";
173
	cell.children[0].onchange = function() {deleteButtonShow(this.checked);};
174
}
175
176
function addMessages() {
177
	const maxExt = ae.GetExtMsgCount();
178
	const maxInt = ae.GetIntMsgCount();
179
180
	let numExt = 0;
181
	let numInt = 0;
182
183
	//TODO handle sent messages separately
184
185
	for (let i = 0; i < (page * 20) + 20; i++) {
186
		const tsInt = (numInt < maxInt) ? ae.GetIntMsgTime(numInt) : 0;
187
		const tsExt = (numExt < maxExt) ? ae.GetExtMsgTime(numExt) : 0;
188
		if (tsInt === 0 && tsExt === 0) break;
189
190
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
191
			if (i < (page * 20)) {
192
				numInt++;
193
				continue;
194
			}
195
196
			addIntMessage(numInt);
197
			numInt++;
198
		} else if (tsExt !== 0) {
199
			if (i < (page * 20)) {
200
				numExt++;
201
				continue;
202
			}
203
204
			addExtMessage(numExt);
205
			numExt++;
206
		}
207
	}
208
}
209
210
function addFile(num) {
211
	const table = document.getElementById("tbody_files");
212
	const row = table.insertRow(-1);
213
214
	let cell = row.insertCell(-1);
215
	cell.textContent = new Date(ae.GetUplMsgTime(num) * 1000).toISOString().slice(0, 10)
216
217
	cell = row.insertCell(-1);
218
	cell.textContent = ae.GetUplMsgBytes(num) / 1024;
219
220
	cell = row.insertCell(-1);
221
	cell.textContent = ae.GetUplMsgTitle(num);
222
223
	cell = row.insertCell(-1);
224
	cell.innerHTML = "<button type=\"button\">D</button>";
225
	cell.children[0].onclick = function() {
226
		const a = document.createElement("a");
227
		a.href = URL.createObjectURL(new Blob([ae.GetUplMsgBody(num).buffer]));
228
		a.download = ae.GetUplMsgTitle(num);
229
		a.click();
230
231
		URL.revokeObjectURL(a.href);
232
		a.href = "";
233
		a.download = "";
234
	};
235
236
	cell = row.insertCell(-1);
237
	cell.innerHTML = "<button type=\"button\">X</button>";
238
	cell.children[0].onclick = function() {
239
		ae.Message_Delete([ae.GetUplMsgIdHex(num)], function(error) {
240
			if (error === 0) {
241
				row.remove();
242
			} else {
243
				console.log("Failed deleting file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
244
			}
245
		});
246
	};
247
}
248
249
function destroyAccount(upk_hex) {
250
	const tbl = document.getElementById("tbody_admin");
251
252
	let rowid = -1;
253
254
	for (let i = 0; i < tbl.rows.length; i++) {
255
		if (upk_hex === tbl.rows[i].cells[0].textContent) {
256
			rowid = i;
257
			break;
258
		}
259
	}
260
261
	if (rowid === -1) return;
262
263
	ae.Account_Delete(upk_hex, function(success) {
264
		if (success) {
265
			tbl.deleteRow(rowid);
266
		} else {
267
			console.log("Failed to destroy account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
268
		}
269
	});
270
}
271
272
function setAccountLevel(upk_hex, level) {
273
	const tbl = document.getElementById("tbody_admin");
274
275
	let rowid = -1;
276
277
	for (let i = 0; i < tbl.rows.length; i++) {
278
		if (tbl.rows[i].cells[0].textContent === upk_hex) {
279
			rowid = i;
280
			break;
281
		}
282
	}
283
284
	if (rowid === -1) return;
285
286
	ae.Account_Update(upk_hex, level, function(success) {
287
		if (!success) {
288
			console.log("Failed to set account level");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
289
			return;
290
		}
291
292
		tbl.rows[rowid].cells[4].textContent = level;
293
294
		if (level === 0) {
295
			tbl.rows[rowid].cells[5].children[0].disabled = false;
296
			tbl.rows[rowid].cells[6].children[0].disabled = true;
297
		} else if (level === ae.GetLevelMax()) {
298
			tbl.rows[rowid].cells[5].children[0].disabled = true;
299
			tbl.rows[rowid].cells[6].children[0].disabled = false;
300
		} else {
301
			tbl.rows[rowid].cells[5].children[0].disabled = false;
302
			tbl.rows[rowid].cells[6].children[0].disabled = false;
303
		}
304
305
		const pkHex = ae.Admin_GetUserPkHex(rowid);
306
		const currentLevel = ae.Admin_GetUserLevel(rowid);
307
		tbl.rows[rowid].cells[5].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
308
		tbl.rows[rowid].cells[6].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
309
	});
310
}
311
312
function deleteAddress(addr) {
313
	let btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
314
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
315
316
	let addressToDelete = -1;
317
318
	for (let i = 0; i < ae.GetAddressCount(); i++) {
319
		if (addr === ae.GetAddress(i)) {
320
			addressToDelete = i;
321
			break;
322
		}
323
	}
324
325
	if (addressToDelete === -1) return;
326
327
	ae.Address_Delete(addressToDelete, function(error) {
328
		if (error !== 0) {
329
			console.log("Failed to delete address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
330
			return;
331
		}
332
333
		document.getElementById("tbody_opt_addr").deleteRow(addressToDelete);
334
		document.getElementById("send_from").remove(addressToDelete);
335
336
		document.getElementById("addr_use_normal").textContent = ae.GetAddressCountNormal();
337
		document.getElementById("addr_use_shield").textContent = ae.GetAddressCountShield();
338
339
		if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) document.getElementById("btn_newaddress").disabled = false;
340
		if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) document.getElementById("btn_newshieldaddress").disabled = false;
341
342
		ae.Private_Update(function(error2) {
343
			if (!error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
344
345
			btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
346
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
347
		});
348
	});
349
}
350
351
function shieldMix(addr) {
352
	let newAddr = "";
353
354
	for (let i = 0; i < 16; i++) {
355
		switch (addr.charAt(i)) {
356
			case '1':
357
				newAddr += "1iIlL".charAt(Math.floor(Math.random() * 5));
358
				break;
359
			case '0':
360
				newAddr += "0oO".charAt(Math.floor(Math.random() * 3));
361
				break;
362
			case 'w':
363
				newAddr += "VvWw".charAt(Math.floor(Math.random() * 4));
364
				break;
365
			default:
366
				newAddr += (Math.random() > 0.5) ? addr.charAt(i) : addr.charAt(i).toUpperCase();
367
		}
368
	}
369
370
	return newAddr;
371
}
372
373
function addAddress(num) {
374
	const addrTable = document.getElementById("tbody_opt_addr");
375
	const row = addrTable.insertRow(-1);
376
377
	let cell = row.insertCell(-1);
378
	cell.textContent = ae.GetAddress(num);
379
	if (cell.textContent.length === 16) cell.className = "mono";
380
	cell.onclick = function() {
381
		if (cell.textContent.length === 16)
382
			navigator.clipboard.writeText(shieldMix(cell.textContent) + "@" + ae.GetDomainEml());
383
		else
384
			navigator.clipboard.writeText(cell.textContent + "@" + ae.GetDomainEml());
385
	};
386
387
	cell = row.insertCell(-1);
388
	cell.innerHTML = ae.GetAddressAccExt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
389
390
	cell = row.insertCell(-1);
391
	cell.innerHTML = ae.GetAddressAccInt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
392
393
	cell = row.insertCell(-1);
394
	cell.innerHTML = "<button type=\"button\">X</button>";
395
	cell.children[0].onclick = function() {deleteAddress(ae.GetAddress(num));};
396
397
	const opt = document.createElement("option");
398
	opt.value = ae.GetAddress(num);
399
	opt.textContent = ae.GetAddress(num) + "@" + ae.GetDomainEml();
400
	document.getElementById("send_from").appendChild(opt);
401
}
402
403
function clearMessages() {
404
	document.getElementById("tbd_inbox").innerHTML = "";
405
	document.getElementById("tbd_snbox").innerHTML = "";
406
	document.getElementById("tbody_files").innerHTML = "";
407
}
408
409
function delMsgs(tblName, btnName) {
410
	const cbs = document.getElementsByClassName("delMsg");
411
	const ids = [];
412
413
	for (let i = 0; i < cbs.length; i++) {
414
		if (cbs[i].checked) ids.push(cbs[i].getAttribute("data-id"));
415
	}
416
417
	if (ids.length > 0) ae.Message_Delete(ids, function(success) {
418
		if (success) {
419
			clearMessages();
420
			addMessages();
421
			document.getElementById(btnName).hidden = true;
422
		} else {
423
			console.log("Failed to delete messages");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
424
		}
425
	});
426
}
427
428
function deleteContact(email) {
429
	const tbl = document.getElementById("tbody_notes_contact");
430
	const rows = tbl.rows;
431
432
	for (let i = 0; i < rows.length; i++) {
433
		if (email === rows[i].cells[0].textContent) {
434
			ae.DeleteContact(i);
435
			tbl.deleteRow(i);
436
			break;
437
		}
438
	}
439
440
	document.getElementById("btn_savenotes").hidden = false;
441
}
442
443
function addContactToTable(mail, name, note) {
444
	const contactTable = document.getElementById("tbody_notes_contact");
445
	const row = contactTable.insertRow(-1);
446
	const cellMail = row.insertCell(-1);
447
	const cellName = row.insertCell(-1);
448
	const cellNote = row.insertCell(-1);
449
	const cellBtnD = row.insertCell(-1);
450
451
	cellMail.className = "left";
452
	cellName.className = "left";
453
	cellNote.className = "left";
454
455
	cellMail.textContent = mail;
456
	cellName.textContent = name;
457
	cellNote.textContent = note;
458
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
459
460
	cellBtnD.onclick = function() {deleteContact(mail);};
461
}
462
463
function addRowAdmin(num) {
464
	const table = document.getElementById("tbody_admin");
465
466
	const row = table.insertRow(-1);
467
	const cellPk = row.insertCell(-1);
468
	const cellMb = row.insertCell(-1);
469
	const cellNa = row.insertCell(-1);
470
	const cellSa = row.insertCell(-1);
471
	const cellLv = row.insertCell(-1);
472
	const cellBtnPl = row.insertCell(-1);
473
	const cellBtnMn = row.insertCell(-1);
474
	const cellBtnDe = row.insertCell(-1);
475
476
	cellPk.textContent = ae.Admin_GetUserPkHex(num);
477
	cellMb.textContent = ae.Admin_GetUserSpace(num);
478
	cellNa.textContent = ae.Admin_GetUserNAddr(num);
479
	cellSa.textContent = ae.Admin_GetUserSAddr(num);
480
	cellLv.textContent = ae.Admin_GetUserLevel(num);
481
	cellBtnPl.innerHTML = "<button type=\"button\">+</button>";
482
	cellBtnMn.innerHTML = "<button type=\"button\">-</button>";
483
	cellBtnDe.innerHTML = "<button type=\"button\">X</button>";
484
485
	cellPk.className = "mono";
486
	if (ae.Admin_GetUserLevel(num) === ae.GetLevelMax()) cellBtnPl.children[0].disabled = true;
487
	if (ae.Admin_GetUserLevel(num) === 0) cellBtnMn.children[0].disabled = true;
488
489
	const pkHex = ae.Admin_GetUserPkHex(num);
490
	const currentLevel = ae.Admin_GetUserLevel(num);
491
	cellBtnPl.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
492
	cellBtnMn.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
493
	cellBtnDe.children[0].onclick = function() {destroyAccount(pkHex);};
494
}
495
496
function reloadInterface() {
497
	if (!ae.IsUserAdmin()) document.getElementById("btn_toadmin").hidden = true;
498
	document.getElementById("div_begin").hidden = true;
499
	document.getElementById("div_allears").hidden = false;
500
501
	clearMessages();
502
	document.getElementById("tbody_admin").innerHTML = "";
503
	document.getElementById("tbody_files").innerHTML = "";
504
	document.getElementById("tbody_notes_contact").innerHTML = "";
505
	document.getElementById("tbody_opt_addr").innerHTML = "";
506
507
	// Contacts
508
	for (let i = 0; i < ae.GetContactCount(); i++) {
509
		addContactToTable(
510
			ae.GetContactMail(i),
511
			ae.GetContactName(i),
512
			ae.GetContactNote(i)
513
		);
514
	}
515
516
	// Addresses
517
	for (let i = 0; i < ae.GetAddressCount(); i++) {
518
		addAddress(i);
519
	}
520
521
	document.getElementById("addr_use_normal").textContent = ae.GetAddressCountNormal();
522
	document.getElementById("addr_use_shield").textContent = ae.GetAddressCountShield();
523
	document.getElementById("addr_max_normal").textContent = ae.GetLimitNormalA(ae.GetUserLevel());
524
	document.getElementById("addr_max_shield").textContent = ae.GetLimitShieldA(ae.GetUserLevel());
525
526
	if (ae.GetAddressCountNormal() >= ae.GetLimitNormalA(ae.GetUserLevel())) document.getElementById("btn_newaddress").disabled = true;
527
	if (ae.GetAddressCountShield() >= ae.GetLimitShieldA(ae.GetUserLevel())) document.getElementById("btn_newshieldaddress").disabled = true;
528
529
	if (ae.IsUserAdmin()) {
530
		const tblLimits = document.getElementById("tbl_limits");
531
		for (let i = 0; i < 4; i++) {
532
			tblLimits.rows[i].cells[1].children[0].value = ae.GetStorageLimit(i);
533
			tblLimits.rows[i].cells[2].children[0].value = ae.GetLimitNormalA(i);
534
			tblLimits.rows[i].cells[3].children[0].value = ae.GetLimitShieldA(i);
535
		}
536
537
		document.getElementById("btn_admin_savelimits").onclick = function() {
538
			const storageLimit = [];
539
			const addrNrmLimit = [];
540
			const addrShdLimit = [];
541
542
			for (let i = 0; i < 4; i++) {
543
				storageLimit[i] = tblLimits.rows[i].cells[1].children[0].value;
544
				addrNrmLimit[i] = tblLimits.rows[i].cells[2].children[0].value;
545
				addrShdLimit[i] = tblLimits.rows[i].cells[3].children[0].value;
546
			}
547
548
			ae.SetLimits(storageLimit, addrNrmLimit, addrShdLimit, function(success) {
549
				if (!success) {
550
					console.log("Failed to update limits");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
551
				}
552
			});
553
		};
554
555
		for (let i = 0; i < ae.Admin_GetUserCount(); i++) {
556
			addRowAdmin(i);
557
		}
558
	}
559
}
560
561
document.getElementById("btn_inbox_prev").onclick = function() {
562
	if (page > 0) {
563
		page--;
564
		clearMessages();
565
		addMessages();
566
		this.disabled = (page === 0);
567
	}
568
};
569
570
document.getElementById("btn_inbox_next").onclick = function() {
571
// TODO: Check if page too high
572
//	if (page > 0) {
573
		page++;
574
		clearMessages();
575
		addMessages();
576
		document.getElementById("btn_inbox_prev").disabled = false;
577
//	}
578
};
579
580
document.getElementById("btn_enter").onclick = function() {
581
	const txtSkey = document.getElementById("txt_skey");
582
	if (!txtSkey.reportValidity()) return;
583
584
	const btn = this;
585
	btn.disabled = true;
586
587
	ae.SetKeys(txtSkey.value, function(successSetKeys) {
588
		if (!successSetKeys) {
589
			console.log("Invalid format for key");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
590
			btn.disabled = false;
591
			return;
592
		}
593
594
		ae.Message_Browse(false, true, function(statusBrowse) {
595
			if (statusBrowse !== 0) {
596
				console.log("Failed to enter");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
597
				btn.disabled = false;
598
				return;
599
			}
600
601
			txtSkey.value = "";
602
			reloadInterface();
603
			document.getElementById("btn_refresh").click();
604
		});
605
	});
606
};
607
608
document.getElementById("btn_refresh").onclick = function() {
609
	const btn = this;
610
	btn.disabled = true;
611
612
	ae.Message_Browse(true, false, function(successBrowse) {
613
		if (successBrowse === 0) {
614
			clearMessages();
615
			addMessages();
616
			for (let i = ae.GetUplMsgCount() - 1; i >= 0; i--) {addFile(i);}
617
		} else {
618
			console.log("Failed to refresh");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
619
		}
620
621
		btn.disabled = false;
622
	});
623
};
624
625
document.getElementById("btn_contact_add").onclick = function() {
626
	const txtMail = document.getElementById("txt_newcontact_mail");
627
	const txtName = document.getElementById("txt_newcontact_name");
628
	const txtNote = document.getElementById("txt_newcontact_note");
629
630
	addContactToTable(txtMail.value, txtName.value, txtNote.value);
631
	ae.AddContact(txtMail.value, txtName.value, txtNote.value);
632
633
	txtMail.value = "";
634
	txtName.value = "";
635
	txtNote.value = "";
636
637
	document.getElementById("btn_savenotes").hidden = false;
638
};
639
640
document.getElementById("btn_savenotes").onclick = function() {
641
	ae.Private_Update(function(success) {
642
		if (success) {
643
			document.getElementById("btn_savenotes").hidden = true;
644
		} else {
645
			console.log("Failed to save note data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
646
		}
647
	});
648
};
649
650
document.getElementById("btn_msgdel").onclick = function() {
651
	delMsgs("tbody_inbox", "btn_msgdel");
652
};
653
654
document.getElementById("btn_sentdel").onclick = function() {
655
	delMsgs("tbody_sentbox", "btn_sentdel");
656
};
657
658
document.getElementById("btn_send").onclick = function() {
659
	const btn = this;
660
	btn.disabled = true;
661
662
	const sfrom = document.getElementById("send_from");
663
	const stitle = document.getElementById("send_title");
664
	const sto = document.getElementById("send_to");
665
	const sbody = document.getElementById("send_body");
666
667
	if (!stitle.reportValidity() || !sto.reportValidity() || !sbody.reportValidity()) return;
668
669
	ae.Address_Lookup(sto.value, function(to_pubkey) {
670
		if (to_pubkey) {
671
			console.log("Lookup ok, trying to send");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
672
673
			ae.Message_Create(stitle.value, sbody.value, sfrom.value, sto.value, to_pubkey, function(success) {
674
				if (success) {
675
					stitle.value = "";
676
					sto.value = "";
677
					sbody.value = "";
678
				} else {
679
					console.log("Failed sending message");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
680
				}
681
682
				btn.disabled = false;
683
			});
684
		} else {
685
			console.log("Failed looking up address");
686
			btn.disabled = false;
687
		}
688
	});
689
};
690
691
document.getElementById("btn_newaddress").onclick = function() {
692
	if (ae.GetAddressCountNormal() >= ae.GetLimitNormalA(ae.GetUserLevel())) return;
693
694
	const txtNewAddr = document.getElementById("txt_newaddress");
695
	if (!txtNewAddr.reportValidity()) return;
696
697
	const btnN = document.getElementById("btn_newaddress");
698
	const btnS = document.getElementById("btn_newshieldaddress");
699
	btnN.disabled = true;
700
	btnS.disabled = true;
701
702
	ae.Address_Create(txtNewAddr.value, function(error1) {
703
		if (error1 === 0) {
704
			ae.Private_Update(function(error2) {
705
				document.getElementById("addr_use_normal").textContent = ae.GetAddressCountNormal();
706
				addAddress(ae.GetAddressCount() - 1);
707
				txtNewAddr.value = "";
708
709
				if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
710
				if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
711
				if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
712
			});
713
		} else {
714
			console.log("Failed to add address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
715
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
716
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
717
		}
718
	});
719
};
720
721
document.getElementById("btn_newshieldaddress").onclick = function() {
722
	if (ae.GetLimitShieldA() >= ae.GetLimitShieldA(ae.GetUserLevel())) return;
723
724
	const btnN = document.getElementById("btn_newaddress");
725
	const btnS = document.getElementById("btn_newshieldaddress");
726
	btnN.disabled = true;
727
	btnS.disabled = true;
728
729
	ae.Address_Create("SHIELD", function(error1) {
730
		if (error1 !== 0) {
731
			console.log("Failed to add Shield address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
732
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
733
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
734
			return;
735
		}
736
737
		ae.Private_Update(function(error2) {
738
			document.getElementById("addr_use_shield").textContent = ae.GetAddressCountShield();
739
			addAddress(ae.GetAddressCount() - 1);
740
741
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
742
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
743
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
744
		});
745
	});
746
};
747
748
document.getElementById("btn_saveaddrdata").onclick = function() {
749
	const tbl = document.getElementById("tbody_opt_addr");
750
751
	for (let i = 0; i < tbl.rows.length; i++) {
752
		ae.SetAddressAccExt(i, tbl.rows[i].cells[1].firstChild.checked);
753
		ae.SetAddressAccInt(i, tbl.rows[i].cells[2].firstChild.checked);
754
	}
755
756
	ae.Address_Update(function(success) {
757
		if (success) {
758
			document.getElementById("btn_saveaddrdata").hidden = true;
759
		} else {
760
			console.log("Failed to save address data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
761
		}
762
	});
763
};
764
765
document.getElementById("btn_admin_addaccount").onclick = function() {
766
	const txtPkey = document.getElementById("txt_newacc_pkey");
767
768
	if (!txtPkey.reportValidity()) return;
769
770
	const btn = document.getElementById("btn_admin_addaccount");
771
	btn.disabled = true;
772
773
	ae.Account_Create(txtPkey.value, function(success) {
774
		if (success) {
775
			addRowAdmin(ae.Admin_GetUserCount() - 1);
776
			txtPkey.value = "";
777
		} else {
778
			console.log("Failed to add account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
779
		}
780
	});
781
782
	btn.disabled = false;
783
};
784
785
document.getElementById("btn_uploadfile").onclick = function() {
786
	const fileSelector = document.getElementById("upfile");
787
	const f = fileSelector.files[0];
788
789
	if (f.name.length + f.size > 8138) {
790
		console.log("Too large");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
791
		fileSelector.value = null;
792
		return;
793
	}
794
795
	const btn = this;
796
	btn.disabled = true;
797
798
	const reader = new FileReader();
799
	reader.onload = function(e) {
0 ignored issues
show
Unused Code introduced by
The parameter e is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
800
		const u8data = new Uint8Array(reader.result);
801
802
		ae.Message_Assign(true, f.name, u8data, function(success) {
803
			if (success) {
804
				addFile(ae.GetFileCount() - 1);
805
				fileSelector.value = null;
806
			} else {
807
				console.log("Failed to upload file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
808
			}
809
810
			btn.disabled = false;
811
		});
812
	};
813
814
	reader.readAsArrayBuffer(f);
815
};
816
817
function navNotesMenu(num) {
818
	for (let i = 0; i < 3; i++) {
819
		if (i === num) {
820
			document.getElementById("div_notes").children[0].children[i].disabled = true;
821
			document.getElementById("div_notes").children[1 + i].hidden = false;
822
		} else {
823
			document.getElementById("div_notes").children[0].children[i].disabled = false;
824
			document.getElementById("div_notes").children[1 + i].hidden = true;
825
		}
826
	}
827
}
828
829
let btns = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
830
btns[0].onclick = function() {navMenu(0);};
831
btns[1].onclick = function() {navMenu(1);};
832
btns[2].onclick = function() {navMenu(2);};
833
btns[3].onclick = function() {navMenu(3);};
834
btns[4].onclick = function() {navMenu(4);};
835
836
btns = document.getElementById("div_notes").getElementsByTagName("button");
837
btns[0].onclick = function() {navNotesMenu(0);};
838
btns[1].onclick = function() {navNotesMenu(1);};
839
btns[2].onclick = function() {navNotesMenu(2);};
840
btns[3].onclick = function() {navNotesMenu(3);};
841
842
document.getElementById("txt_skey").onkeyup = function(e) {
843
	if (e.key === "Enter") document.getElementById("btn_enter").click();
844
};
845
846
navMenu(0);
847
848
});
849